--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / frontend / js / localeThemeOracles.js
Displaying Raw • Download
meshchatx/src/frontend/js/localeThemeOracles.js master (b89dc9e6) Text, 2.33 KB
T8b949e// SPDX-License-Identifier: 0BSD
T8b949e/**
* Independent oracles for UI locale and theme invariants.
* Tests compare product code against these predictions without duplicating implementation details.
*/
Tff7b72import Tb4b4b4{ Te6edf3listLocaleCodesTb4b4b4, Te6edf3normalizeUiLocaleCode Tb4b4b4} Tff7b72from Ta5d6ff"./localeLoader.js"Tb4b4b4;
T8b949e/**
* Expected boot theme after boot-theme.js runs.
*
* @param {string | null | undefined} storedTheme from localStorage or Android bridge
* @returns {{ mode: "light" | "dark", htmlDark: boolean }}
*/
Tff7b72export Tff7b72function Te6edf3bootThemeOracleTb4b4b4(Te6edf3storedThemeTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3mode Tff7b72= Te6edf3storedTheme Tff7b72=== Ta5d6ff"light" Tff7b72|| Te6edf3storedTheme Tff7b72=== Ta5d6ff"dark" Tff7b72? Te6edf3storedTheme Tff7b72: Ta5d6ff"dark"Tb4b4b4;
Tff7b72return Tb4b4b4{
Te6edf3modeTb4b4b4,
Te6edf3htmlDarkTff7b72: Te6edf3mode Tff7b72=== Ta5d6ff"dark"Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Expected WebGL clear color for light vs dark (matches networkVisualiserWebGL.js).
*
* @param {boolean} dark
* @returns {{ r: number, g: number, b: number, a: number }}
*/
Tff7b72export Tff7b72function Te6edf3visualiserClearColorOracleTb4b4b4(Te6edf3darkTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3darkTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{ Te6edf3rTff7b72: T79c0ff0.035Tb4b4b4, Te6edf3gTff7b72: T79c0ff0.035Tb4b4b4, Te6edf3bTff7b72: T79c0ff0.04Tb4b4b4, Te6edf3aTff7b72: T79c0ff1 Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72return Tb4b4b4{ Te6edf3rTff7b72: T79c0ff0.973Tb4b4b4, Te6edf3gTff7b72: T79c0ff0.98Tb4b4b4, Te6edf3bTff7b72: T79c0ff0.988Tb4b4b4, Te6edf3aTff7b72: T79c0ff1 Tb4b4b4}Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Expected visualiser dark flag from app config and html fallback.
*
* @param {string | null | undefined} configTheme
* @param {boolean} htmlHasDarkClass
* @returns {boolean}
*/
Tff7b72export Tff7b72function Te6edf3visualiserIsDarkOracleTb4b4b4(Te6edf3configThemeTb4b4b4, Te6edf3htmlHasDarkClassTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3configTheme Tff7b72=== Ta5d6ff"light"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3configTheme Tff7b72=== Ta5d6ff"dark"Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}
Tff7b72return Tffa657BooleanTb4b4b4(Te6edf3htmlHasDarkClassTb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* UI locale after normalization must always be a bundled pack code.
*
* @param {unknown} raw
* @returns {string}
*/
Tff7b72export Tff7b72function Te6edf3uiLocalePackOracleTb4b4b4(Te6edf3rawTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3code Tff7b72= Te6edf3normalizeUiLocaleCodeTb4b4b4(Te6edf3rawTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3packs Tff7b72= Te6edf3listLocaleCodesTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3packsTb4b4b4.Te6edf3includesTb4b4b4(Te6edf3codeTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72throw Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff`Ta5d6fforacle violation: normalized locale Tffd700${Te6edf3codeTffd700}Ta5d6ff not in packsTa5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3codeTb4b4b4;
Tb4b4b4}
T8b949e/**
* Reticulum manual doc language codes must not be written to UI config.language.
*
* @param {string} docLang
* @returns {boolean} true when docLang would corrupt UI locale if stored as config.language
*/
Tff7b72export Tff7b72function Te6edf3docLangCorruptsUiLocaleTb4b4b4(Te6edf3docLangTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3normalized Tff7b72= Te6edf3normalizeUiLocaleCodeTb4b4b4(Te6edf3docLangTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3packs Tff7b72= Te6edf3listLocaleCodesTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Tff7b72!Te6edf3packsTb4b4b4.Te6edf3includesTb4b4b4(Te6edf3docLangTb4b4b4) Tff7b72&& Te6edf3packsTb4b4b4.Te6edf3includesTb4b4b4(Te6edf3normalizedTb4b4b4) Tff7b72&& Te6edf3normalized Tff7b72!== Te6edf3docLangTb4b4b4;
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────